<?php

namespace app\common\model;

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

/**
 * 账户基本数据处理
 * 
 * 时间 ： 2020年4月2日23:33:35
 * 作者 ： 夏立军
 */
class ExcelModel
{

    /**
     * 验证excel的正确性
     * 
     * @param $file 文件位置
     */
    public function validationExcel(string $file = '')
    {
        $objRead = IOFactory::createReader('Xlsx');

        if (!$objRead->canRead($file)) {
            $objRead = IOFactory::createReader('Xls');

            if (!$objRead->canRead($file)) {
                return null;
            }
        }

        return $objRead;
    }

    /**
     * 通过给定内容创建 excel 表格
     * @param $data 给定的内容
     * @param $fileName   导出文件名称
     * @return 是否成功的创建表格
     */
    public function create_template(array $data, string $fileName)
    {
        try {
            $objSpreadsheet = new Spreadsheet();
            //设置Excel Sheet 第 0 页
            $activeSheet = $objSpreadsheet->setActiveSheetIndex(0);
            //设置当前sheet的标题
            $activeSheet->setTitle($fileName);

            $content_arr = [
                'A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1', 'M1',
                'N1', 'O1', 'P1', 'Q1', 'R1', 'S1', 'T1', 'U1', 'V1', 'W1', 'X1', 'Y1', 'Z1',
                'AA1', 'AB1', 'AC1', 'AD1', 'AE1', 'AF1', 'AG1', 'AH1', 'AI1', 'AJ1', 'AK1',
                'AL1', 'AM1', 'AN1', 'AO1', 'AP1', 'AQ1', 'AR1', 'AS1', 'AT1', 'AU1', 'AV1',
                'AW1', 'AX1', 'AY1', 'AZ1',
                'BA1', 'BB1', 'BC1', 'BD1', 'BE1', 'BF1', 'BG1', 'BH1', 'BI1', 'BJ1', 'BK1',
                'BL1', 'BM1', 'BN1', 'BO1', 'BP1', 'BQ1', 'BR1', 'BS1', 'BT1', 'BU1', 'BV1',
                'BW1', 'BX1', 'BY1', 'BZ1',
                'CA1', 'CB1', 'CC1', 'CD1', 'CE1', 'CF1', 'CG1', 'CH1', 'CI1', 'CJ1', 'CK1',
                'CL1', 'CM1', 'CN1', 'CO1', 'CP1', 'CQ1', 'CR1', 'CS1', 'CT1', 'CU1', 'CV1',
                'CW1', 'CX1', 'CY1', 'CZ1',
            ];

            // 配置表头
            $i = 0;
            foreach ($data['names'] as $row) {
                $activeSheet->setCellValue($content_arr[$i], $row);
                $i++;
            }

            // 创建并生成模板表格
            $excel_template_config =  config('ams_config.excel_template');
            $objWriter = IOFactory::createWriter($objSpreadsheet, $excel_template_config['excel_type']);
            $objWriter->save($excel_template_config['save_path'] . '/' . $fileName . $excel_template_config['excel_format']);
        } catch (\Throwable $th) {
            return false;
        }

        return true;
    }

    /**
     * 删除指定文件
     * 
     * @param $file_name 要删除的文件名
     * @return bool 删除的状态
     */
    public function delFile($file_name)
    {
        $excel_template_config =  config('ams_config.excel_template');
        $path = $excel_template_config['save_path'] . $file_name . $excel_template_config['excel_format'];


        if (!is_file($path)) {
            return ['code' => 0, 'msg' => '文件不存在'];
        }

        if (unlink($path)) {
            return ['code' => 0, 'msg' => '文件删除成功'];
        } else {
            return ['code' => 1, 'msg' => '文件删除失败'];
        }
    }

    /**
     * 用于导出表格数据用的
     * 
     * @param $uid 用户ID
     * @param $file_name 导出后生成的文件名
     * @param $table_content 到出时的列名
     * @param $data 到出时的具体数据
     * @return 是否导出完成
     */
    public function excel_import(int $uid, string $file_name, array $table_content, array $data)
    {
        try {
            // 引入 excel 表格的创建工具
            $objSpreadsheet = new Spreadsheet();
            // 列的提示符
            $content_arr = [
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
                'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
                'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK',
                'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV',
                'AW', 'AX', 'AY', 'AZ',
                'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK',
                'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV',
                'BW', 'BX', 'BY', 'BZ',
                'CA', 'CB', 'CC', 'CD', 'CE', 'CF', 'CG', 'CH', 'CI', 'CJ', 'CK',
                'CL', 'CM', 'CN', 'CO', 'CP', 'CQ', 'CR', 'CS', 'CT', 'CU', 'CV',
                'CW', 'CX', 'CY', 'CZ',
            ];
            //设置Excel Sheet 第 0 页
            $activeSheet = $objSpreadsheet->setActiveSheetIndex(0);
            //设置当前sheet的标题 使用文件名作为sheet的标题
            $activeSheet->setTitle($file_name);

            // 配置表头
            // 列
            $col = 0;
            // 行
            $row = 1;
            foreach ($table_content['names'] as $table_data) {
                $activeSheet->setCellValue($content_arr[$col] . $row, $table_data);
                $col++;
            }
            $row++;

            // 一共有多少列
            $n = $col;
            // 分类中间表的数值类型
            $classify_type_list = config('ams_config.classify_type_list');

            // 开始插入数据
            foreach ($data as $content) {

                // 按列插入内容
                for ($i = 0; $i < $n; $i++) {
                    $tmp_data = '';
                    foreach ($classify_type_list as $classify_type) {
                        // 解析数据类型
                        if ($classify_type['value'] == $table_content['selects'][$i]) {
                            if ($classify_type['name'] == '数值') {
                                $tmp_data = $content[$table_content['cols'][$i]] / 100;
                            } else if ($classify_type['name'] == '时间') {
                                $tmp_data = date('Y-m-d', $content[$table_content['cols'][$i]]);
                            } else {
                                $tmp_data = $content[$table_content['cols'][$i]];
                            }
                        }
                    }
                    $activeSheet->setCellValue($content_arr[$i] . $row, $tmp_data);
                }
                $row++;
            }

            $excel_template_config =  config('ams_config.excel_template');
            $objWriter = IOFactory::createWriter($objSpreadsheet, $excel_template_config['excel_type']);
            $file_name =  $uid . '-' . $file_name . $excel_template_config['excel_format'];
            $objWriter->save($excel_template_config['import_path'] . '/' . $file_name);
        } catch (\Throwable $th) {
            return ['code' => 1, 'msg' => $th->getMessage()];
        }
        return ['code' => 0, 'msg' => $file_name];
    }
}
